/*
 * TDS PEC 4
 * Grupo 3H2M
 * 
 * El paquete <code>edu.uoc.tds.pec4.estadisticas</code> contiene la implementación de
 * todas las clases necesarias para la interfaz gráfica del ss de estadísticas
 *
 */
package edu.uoc.tds.pec4.estadisticas;

import edu.uoc.tds.pec4.rmi.GestorEstadisticasInterface;
import edu.uoc.tds.pec4.beans.CiudadDTO;
import edu.uoc.tds.pec4.beans.PaisDTO;
import edu.uoc.tds.pec4.beans.ProvinciaDTO;
import edu.uoc.tds.pec4.beans.RentabilidadLocalizacionDTO;
import edu.uoc.tds.pec4.beans.TopDTO;
import edu.uoc.tds.pec4.rmi.GestorDiccionarioInterface;
import edu.uoc.tds.pec4.common.filters.FiltroFechas;
import edu.uoc.tds.pec4.common.filters.FiltroLocalizacion;
import edu.uoc.tds.pec4.common.util.Constantes;
import edu.uoc.tds.pec4.common.util.TDSLanguageUtils;
import edu.uoc.tds.pec4.common.util.UtilidadesGUI;
import edu.uoc.tds.pec4.common.validation.ValidarGUI;
import edu.uoc.tds.pec4.server.bbdd.exceptions.GestorDiccionarioException;
import edu.uoc.tds.pec4.server.bbdd.exceptions.GestorEstadisticasException;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.swing.DefaultListModel;
import javax.swing.JComboBox;
import javax.swing.JOptionPane;

/**
 *
 * @author Isabel Guerra Monclova
 */
public class JIFRentabilidadLocalizaciones extends javax.swing.JInternalFrame {
    
    /** clientConnected Indica si el cliente está conectado al servidor */
    private boolean clientConnected = false;
    /** objRemoto Es el objeto empleado como interfaz en la comunicación RMI */
    private GestorDiccionarioInterface objRemotoDic = null;
    private GestorEstadisticasInterface objRemotoEstadisticas = null;
    
    private DefaultListModel itemsSeleccionar = null;
    private DefaultListModel itemsSeleccionado = null;
    
    private DialogResultadoRentabilidadLocalizaciones ventanaResultados = null;
    
    private boolean itemsCiudades = false;
    private boolean itemsProvincias = false;
    private boolean itemsPaises = false;

    /** Creates new form JIFRankingAulas */
    public JIFRentabilidadLocalizaciones() {
        
        super(TDSLanguageUtils.getMessage("estadistica.rentabilidad.localizaciones.titulo"), false, true, false);
        
        conectarCliente();
        initComponents();
        inicializarComponentes();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jPanel3 = new javax.swing.JPanel();
        labelPais = new javax.swing.JLabel();
        labelProvincia = new javax.swing.JLabel();
        labelCiudad = new javax.swing.JLabel();
        comboPais = getComboPais();
        comboProvincia = getComboProvincia();
        comboCiudad = getComboCiudad();
        jPanel1 = new javax.swing.JPanel();
        jScrollPane1 = new javax.swing.JScrollPane();
        listaSeleccionar = new javax.swing.JList();
        doblederecha = new javax.swing.JButton();
        derecha = new javax.swing.JButton();
        dobleizquierda = new javax.swing.JButton();
        izquierda = new javax.swing.JButton();
        jPanel2 = new javax.swing.JPanel();
        jScrollPane2 = new javax.swing.JScrollPane();
        listaSeleccionado = new javax.swing.JList();
        jPanel4 = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        fechaDesde = new javax.swing.JTextField();
        jLabel2 = new javax.swing.JLabel();
        fechaHasta = new javax.swing.JTextField();
        jPanel6 = new javax.swing.JPanel();
        comboTop = getComboTop();
        jPanel7 = new javax.swing.JPanel();
        botonCancelar = new javax.swing.JButton();
        botonGenerar = new javax.swing.JButton();

        jPanel3.setBorder(javax.swing.BorderFactory.createTitledBorder(null, TDSLanguageUtils.getMessage("estadistica.ranking.filtro.localizacion"), javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Tahoma", 1, 11))); // NOI18N

        labelPais.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
        labelPais.setText(TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.pais"));

        labelProvincia.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
        labelProvincia.setText(TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.provincia"));

        labelCiudad.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
        labelCiudad.setText(TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.ciudad"));

        jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1), TDSLanguageUtils.getMessage("estadistica.ranking.seleccionar")));

        jScrollPane1.setViewportView(listaSeleccionar);

        doblederecha.setText(TDSLanguageUtils.getMessage("estadistica.ranking.dobleflecha.derecha"));
        doblederecha.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                doblederechaActionPerformed(evt);
            }
        });

        derecha.setText(TDSLanguageUtils.getMessage("estadistica.ranking.flecha.derecha"));
        derecha.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                derechaActionPerformed(evt);
            }
        });

        dobleizquierda.setText(TDSLanguageUtils.getMessage("estadistica.ranking.dobleflecha.izquierda"));
        dobleizquierda.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                dobleizquierdaActionPerformed(evt);
            }
        });

        izquierda.setText(TDSLanguageUtils.getMessage("estadistica.ranking.flecha.izquierda"));
        izquierda.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                izquierdaActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
                .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 234, Short.MAX_VALUE)
                .addGap(18, 18, 18)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(izquierda, 0, 0, Short.MAX_VALUE)
                    .addComponent(dobleizquierda, 0, 0, Short.MAX_VALUE)
                    .addComponent(derecha, 0, 0, Short.MAX_VALUE)
                    .addComponent(doblederecha, javax.swing.GroupLayout.PREFERRED_SIZE, 65, Short.MAX_VALUE)))
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(doblederecha)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(derecha)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(dobleizquierda)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(izquierda))
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap())
        );

        jPanel2.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createEmptyBorder(1, 1, 1, 1), TDSLanguageUtils.getMessage("estadistica.ranking.seleccionado")));

        jScrollPane2.setViewportView(listaSeleccionado);

        javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
        jPanel2.setLayout(jPanel2Layout);
        jPanel2Layout.setHorizontalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 226, Short.MAX_VALUE)
        );
        jPanel2Layout.setVerticalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel2Layout.createSequentialGroup()
                .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3);
        jPanel3.setLayout(jPanel3Layout);
        jPanel3Layout.setHorizontalGroup(
            jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel3Layout.createSequentialGroup()
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(labelProvincia)
                    .addComponent(labelPais)
                    .addComponent(labelCiudad))
                .addGap(18, 18, 18)
                .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(comboCiudad, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(comboProvincia, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(comboPais, 0, 133, Short.MAX_VALUE))
                .addGap(18, 18, 18)
                .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );
        jPanel3Layout.setVerticalGroup(
            jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel3Layout.createSequentialGroup()
                .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(jPanel1, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jPanel2, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addGroup(javax.swing.GroupLayout.Alignment.LEADING, jPanel3Layout.createSequentialGroup()
                        .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(labelPais)
                            .addComponent(comboPais, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(labelProvincia)
                            .addComponent(comboProvincia, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(labelCiudad)
                            .addComponent(comboCiudad, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))))
                .addContainerGap())
        );

        jPanel4.setBorder(javax.swing.BorderFactory.createTitledBorder(null, TDSLanguageUtils.getMessage("estadistica.ranking.filtro.fechas"), javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Tahoma", 1, 11))); // NOI18N

        jLabel1.setFont(new java.awt.Font("Tahoma", 1, 11));
        jLabel1.setText(TDSLanguageUtils.getMessage("estadistica.ranking.fecha.desde"));

        fechaDesde.setText(TDSLanguageUtils.getMessage("formato.fecha"));

        jLabel2.setFont(new java.awt.Font("Tahoma", 1, 11));
        jLabel2.setText(TDSLanguageUtils.getMessage("estadistica.ranking.fecha.hasta"));

        fechaHasta.setText(TDSLanguageUtils.getMessage("formato.fecha"));

        javax.swing.GroupLayout jPanel4Layout = new javax.swing.GroupLayout(jPanel4);
        jPanel4.setLayout(jPanel4Layout);
        jPanel4Layout.setHorizontalGroup(
            jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel4Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jLabel1)
                    .addComponent(fechaDesde, javax.swing.GroupLayout.PREFERRED_SIZE, 110, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jLabel2)
                    .addComponent(fechaHasta, javax.swing.GroupLayout.PREFERRED_SIZE, 110, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(34, Short.MAX_VALUE))
        );
        jPanel4Layout.setVerticalGroup(
            jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel4Layout.createSequentialGroup()
                .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel1)
                    .addComponent(jLabel2))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(fechaDesde, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(fechaHasta, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(47, Short.MAX_VALUE))
        );

        jPanel6.setBorder(javax.swing.BorderFactory.createTitledBorder(null, TDSLanguageUtils.getMessage("estadistica.ranking.top"), javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Tahoma", 1, 11))); // NOI18N

        javax.swing.GroupLayout jPanel6Layout = new javax.swing.GroupLayout(jPanel6);
        jPanel6.setLayout(jPanel6Layout);
        jPanel6Layout.setHorizontalGroup(
            jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel6Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(comboTop, 0, 161, Short.MAX_VALUE)
                .addContainerGap())
        );
        jPanel6Layout.setVerticalGroup(
            jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel6Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(comboTop, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(61, Short.MAX_VALUE))
        );

        botonCancelar.setText(TDSLanguageUtils.getMessage("boton.cancelar"));
        botonCancelar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonCancelarActionPerformed(evt);
            }
        });

        botonGenerar.setText(TDSLanguageUtils.getMessage("estadistica.rentabilidad.generar"));
        botonGenerar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonGenerarActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout jPanel7Layout = new javax.swing.GroupLayout(jPanel7);
        jPanel7.setLayout(jPanel7Layout);
        jPanel7Layout.setHorizontalGroup(
            jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel7Layout.createSequentialGroup()
                .addContainerGap(555, Short.MAX_VALUE)
                .addComponent(botonGenerar, javax.swing.GroupLayout.PREFERRED_SIZE, 152, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addComponent(botonCancelar, javax.swing.GroupLayout.PREFERRED_SIZE, 110, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );
        jPanel7Layout.setVerticalGroup(
            jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel7Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel7Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(botonCancelar)
                    .addComponent(botonGenerar))
                .addContainerGap(17, Short.MAX_VALUE))
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(jPanel7, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                        .addGroup(layout.createSequentialGroup()
                            .addComponent(jPanel4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                            .addComponent(jPanel6, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addComponent(jPanel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jPanel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(jPanel4, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jPanel6, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jPanel7, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

private void doblederechaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_doblederechaActionPerformed

    //Si hay localizaciones, comprobamos si es ciudad, provincia o país
    if (itemsSeleccionado == null ) {
        itemsSeleccionar = new DefaultListModel();
        for(int i= 0; i<itemsSeleccionar.getSize(); i++) {
            itemsSeleccionado.addElement(itemsSeleccionar.get(i));
        }
    } else { 
            for(int i= 0; i<itemsSeleccionar.getSize(); i++) {
                itemsSeleccionado.addElement(itemsSeleccionar.get(i));
            }             
    }
    
    listaSeleccionado.setModel(itemsSeleccionado);
}//GEN-LAST:event_doblederechaActionPerformed

private void derechaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_derechaActionPerformed
    
    //Si hay localizaciones, comprobamos si es ciudad, provincia o país
    if (itemsSeleccionado == null ) {
        itemsSeleccionado = new DefaultListModel();
    }
    int size = 0;
    for(int i= 0; i<listaSeleccionar.getSelectedValues().length; i++) {
            Object item = listaSeleccionar.getSelectedValues()[i];
            
            size = listaSeleccionado.getModel().getSize();
            itemsSeleccionado.add(size, item);
            size++;
    }
        
    listaSeleccionado.setModel(itemsSeleccionado);
}//GEN-LAST:event_derechaActionPerformed

private void dobleizquierdaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_dobleizquierdaActionPerformed
    itemsSeleccionado.removeAllElements();
}//GEN-LAST:event_dobleizquierdaActionPerformed

private void izquierdaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_izquierdaActionPerformed
    
    //Vamos eliminando los items seleccionados
     int aeliminar[] = listaSeleccionado.getSelectedIndices();
     for (int i = 0; i<aeliminar.length;i++){
          itemsSeleccionado.remove(aeliminar[i]);
     }

     listaSeleccionado.setModel(itemsSeleccionado);        
}//GEN-LAST:event_izquierdaActionPerformed

private void botonGenerarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonGenerarActionPerformed

    try {
       
            boolean modal = true;
            Frame ventanaPrincipal = JOptionPane.getFrameForComponent(this);
            
            //Obtenemos los datos seleccionados
            List<CiudadDTO> ciudades = new ArrayList<CiudadDTO>();
            List<ProvinciaDTO> provincias = new ArrayList<ProvinciaDTO>();
            List<PaisDTO> paises = new ArrayList<PaisDTO>();
            
            //Si no se ha seleccionado ninguna localización, se deberá seleccionar al menos una
            if (itemsSeleccionado == null) {
                    JOptionPane.showMessageDialog(null, TDSLanguageUtils.getMessage("estadistica.error.formulario.localizacion"),
                        TDSLanguageUtils.getMessage("estadistica.error"), JOptionPane.ERROR_MESSAGE);                    
                
            } else {
                int size = itemsSeleccionado.getSize();
                //Detectamos el tipo del primer elemento
                if(itemsSeleccionado.getElementAt(0) instanceof CiudadDTO) {
                    itemsCiudades = true;
                } else if (itemsSeleccionado.getElementAt(0) instanceof ProvinciaDTO) {
                    itemsProvincias = true;
                }else {
                    itemsPaises = true;
                }
                
                int tipoLocalizacion;
                boolean localizacionMixta = false;
                if(this.itemsCiudades) {
                    tipoLocalizacion = Constantes.TIPO_LOCALIZACION_CIUDADES;

                    for(int i=0; i<size;i++) {
                        if (itemsSeleccionado.getElementAt(i) instanceof CiudadDTO) {
                            CiudadDTO item = (CiudadDTO) itemsSeleccionado.getElementAt(i);
                            ciudades.add(item);
                        } else {
                            localizacionMixta = true;
                        }
                    }
                }else if(this.itemsProvincias) {
                    tipoLocalizacion = Constantes.TIPO_LOCALIZACION_PROVINCIAS;
                    for(int i=0; i<size;i++) {
                        if (itemsSeleccionado.getElementAt(i) instanceof ProvinciaDTO) {
                            ProvinciaDTO item = (ProvinciaDTO) itemsSeleccionado.getElementAt(i);
                            provincias.add(item);
                        } else {
                            localizacionMixta = true;
                        }
                    }                    
                }else {
                    tipoLocalizacion = Constantes.TIPO_LOCALIZACION_PAISES;
                    for(int i=0; i<size;i++) {
                        if (itemsSeleccionado.getElementAt(i) instanceof PaisDTO) {
                            PaisDTO item = (PaisDTO) itemsSeleccionado.getElementAt(i);
                            paises.add(item);
                        } else {
                            localizacionMixta = true;
                        }
                    }                    
                }
                FiltroLocalizacion filtroLoc = new FiltroLocalizacion();
                filtroLoc.setCiudades(ciudades);
                filtroLoc.setProvincias(provincias);
                filtroLoc.setPaises(paises);

                //Parámetros
                Date inicio = null;
                Date fin = null;
                try {
                    inicio = UtilidadesGUI.obtenerFecha(fechaDesde.getText());

                } catch (ParseException ex) {
                    JOptionPane.showMessageDialog(null, TDSLanguageUtils.getMessage("estadistica.error.formulario.fechaDesde"),
                            TDSLanguageUtils.getMessage("estadistica.error"), JOptionPane.ERROR_MESSAGE);
                }
                try {            
                    fin = UtilidadesGUI.obtenerFecha(fechaHasta.getText());
                } catch (ParseException ex) {
                    JOptionPane.showMessageDialog(null, TDSLanguageUtils.getMessage("estadistica.error.formulario.fechaHasta"),
                            TDSLanguageUtils.getMessage("estadistica.error"), JOptionPane.ERROR_MESSAGE);
                }

                if (!ValidarGUI.datesInOrder(inicio, fin)) {
                     JOptionPane.showMessageDialog(null, TDSLanguageUtils.getMessage("estadistica.error.formulario.orden.fechas"),
                            TDSLanguageUtils.getMessage("estadistica.error"), JOptionPane.ERROR_MESSAGE);               
                } else if (localizacionMixta) {
                     JOptionPane.showMessageDialog(null, TDSLanguageUtils.getMessage("estadistica.error.formulario.misma.localizacion"),
                            TDSLanguageUtils.getMessage("estadistica.error"), JOptionPane.ERROR_MESSAGE);                                   
                } else {

                    FiltroFechas filtroFechas = new FiltroFechas();
                    filtroFechas.setFechaInicio(inicio);
                    filtroFechas.setFechaFin(fin);

                    int valorTop = ((TopDTO)comboTop.getSelectedItem()).getValue();
                    String textoTop = ((TopDTO)comboTop.getSelectedItem()).getTopText();
                    
                    //Obtener resultados
                    List<RentabilidadLocalizacionDTO> resultados = objRemotoEstadisticas.getRentabilidadLocalizacion(filtroLoc, filtroFechas, 
                            tipoLocalizacion, valorTop);

                    if (resultados.size()>0) {
                        ventanaResultados = new DialogResultadoRentabilidadLocalizaciones (ventanaPrincipal,modal);
                        ventanaResultados.setFechaInicio(fechaDesde);
                        ventanaResultados.setFechaFin(fechaHasta);
                        ventanaResultados.setLocalizacion(filtroLoc, tipoLocalizacion);
                        ventanaResultados.setTop(textoTop);
                        ventanaResultados.setListado(resultados);
                        ventanaResultados.setVisible(Boolean.TRUE);

                    } else {
                        JOptionPane.showMessageDialog(null,
                                TDSLanguageUtils.getMessage("estadistica.sinresultados"),
                                TDSLanguageUtils.getMessage("estadistica.resultado"),
                                JOptionPane.INFORMATION_MESSAGE);
                    }
                } //fin si fechas en orden
            } //fin si hay al menos una localización

        
      } catch (GestorEstadisticasException giE) {
            JOptionPane.showMessageDialog(null,
                  TDSLanguageUtils.getMessage("estadistica.err.gestor.desc") + Constantes.SL +
                  giE.getMessage(), TDSLanguageUtils.getMessage("estadistica.err.gestor"),
                  JOptionPane.ERROR_MESSAGE);
      } catch (RemoteException eRe) {
            JOptionPane.showMessageDialog(null,
                    TDSLanguageUtils.getMessage("estadistica.err.gestor.desc") + Constantes.SL +
                    eRe.getMessage(), TDSLanguageUtils.getMessage("estadistica.err.gestor"),
                    JOptionPane.ERROR_MESSAGE);
      } 
}//GEN-LAST:event_botonGenerarActionPerformed

private void botonCancelarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonCancelarActionPerformed
    setVisible(false);
}//GEN-LAST:event_botonCancelarActionPerformed

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton botonCancelar;
    private javax.swing.JButton botonGenerar;
    private javax.swing.JComboBox comboCiudad;
    private javax.swing.JComboBox comboPais;
    private javax.swing.JComboBox comboProvincia;
    private javax.swing.JComboBox comboTop;
    private javax.swing.JButton derecha;
    private javax.swing.JButton doblederecha;
    private javax.swing.JButton dobleizquierda;
    private javax.swing.JTextField fechaDesde;
    private javax.swing.JTextField fechaHasta;
    private javax.swing.JButton izquierda;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JPanel jPanel3;
    private javax.swing.JPanel jPanel4;
    private javax.swing.JPanel jPanel6;
    private javax.swing.JPanel jPanel7;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JLabel labelCiudad;
    private javax.swing.JLabel labelPais;
    private javax.swing.JLabel labelProvincia;
    private javax.swing.JList listaSeleccionado;
    private javax.swing.JList listaSeleccionar;
    // End of variables declaration//GEN-END:variables
 
    /**
     * Este método inicializa el desplegable de paises
     *
     * @return javax.swing.JComboBox
     */
    private JComboBox getComboPais() {
        if (comboPais == null) {
            try {
                List<PaisDTO> paises = objRemotoDic.listaPaises();
                paises.add(0, new PaisDTO(Constantes.NO_SELECT, TDSLanguageUtils.getMessage("combo.pais.todos.opciondefecto")));
                comboPais = new JComboBox(paises.toArray());
                comboPais.addActionListener(new ActionListener() {

                    public void actionPerformed(ActionEvent e) {
                        comboPaisActionPerformed(e);
                    }
                });
            } catch (GestorDiccionarioException giE) {
                JOptionPane.showMessageDialog(null,
                        giE.getMessage(), TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.err.pais"),
                        JOptionPane.ERROR_MESSAGE);
            } catch (RemoteException eRe) {
                JOptionPane.showMessageDialog(null,
                        eRe.getMessage(), TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.err.pais"),
                        JOptionPane.ERROR_MESSAGE);
            }
        }
        return comboPais;        
    }

    /**
     * Este método inicializa el desplegable de provincias
     *
     * @return javax.swing.JComboBox
     */
    private JComboBox getComboProvincia() {
        if (comboProvincia == null) {
            try {
                int idPais = ((PaisDTO) comboPais.getSelectedItem()).getIdPais();
                List<ProvinciaDTO> provincias = objRemotoDic.listaProvincias(idPais);
                provincias.add(0, new ProvinciaDTO(Constantes.NO_SELECT, TDSLanguageUtils.getMessage("combo.provincia.todos.opciondefecto")));
                comboProvincia = new JComboBox(provincias.toArray());
                comboProvincia.addActionListener(new ActionListener() {

                    public void actionPerformed(ActionEvent e) {
                        comboProvinciaActionPerformed(e);
                    }
                });
            } catch (GestorDiccionarioException giE) {
                JOptionPane.showMessageDialog(null,
                        giE.getMessage(), TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.err.provincia"),
                        JOptionPane.ERROR_MESSAGE);
            } catch (RemoteException eRe) {
                JOptionPane.showMessageDialog(null,
                        eRe.getMessage(), TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.err.provincia"),
                        JOptionPane.ERROR_MESSAGE);
            }
        }
        return comboProvincia;
    }

    /**
     * Este método inicializa el desplegable de ciudades
     *
     * @return javax.swing.JComboBox
     */
    private JComboBox getComboCiudad() {
        if (comboCiudad == null) {
            try {
                int idProvincia = ((ProvinciaDTO) comboProvincia.getSelectedItem()).getIdProvincia();
                List<CiudadDTO> ciudades = objRemotoDic.listaCiudades(idProvincia);
                ciudades.add(0, new CiudadDTO(Constantes.NO_SELECT, TDSLanguageUtils.getMessage("combo.ciudad.todos.opciondefecto")));
                comboCiudad = new JComboBox(ciudades.toArray());
                comboCiudad.addActionListener(new ActionListener() {

                    public void actionPerformed(ActionEvent e) {
                        //comboCiudadActionPerformed(e);
                    }
                });
            } catch (GestorDiccionarioException giE) {
                JOptionPane.showMessageDialog(null,
                        giE.getMessage(), TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.err.ciudad"),
                        JOptionPane.ERROR_MESSAGE);
            } catch (RemoteException eRe) {
                JOptionPane.showMessageDialog(null,
                        eRe.getMessage(), TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.err.ciudad"),
                        JOptionPane.ERROR_MESSAGE);
            }
        }
        return comboCiudad;
    }
    
    /**
     * Conectar con el servidor RMI de paises
     * Permitela conexion con el servidor RMI
     */
    private void conectarCliente() {
        try {
            objRemotoDic = (GestorDiccionarioInterface) Naming.lookup("GestorDiccionario");
            objRemotoEstadisticas = (GestorEstadisticasInterface) Naming.lookup("GestorRanking");
            clientConnected = true;
        } catch (NotBoundException eNbe) {
            objRemotoDic = null;
            objRemotoEstadisticas = null;
            JOptionPane.showMessageDialog(null,
                    TDSLanguageUtils.getMessage("cliente.error.notbound") + "\n" + eNbe.getMessage(),
                    TDSLanguageUtils.getMessage("cliente.error"), JOptionPane.ERROR_MESSAGE);
        } catch (RemoteException eRe) {
            objRemotoDic = null;
            objRemotoEstadisticas = null;
            JOptionPane.showMessageDialog(null,
                    TDSLanguageUtils.getMessage("cliente.error.url") + "\n" + eRe.getMessage(),
                    TDSLanguageUtils.getMessage("cliente.error"), JOptionPane.ERROR_MESSAGE);
        } catch (MalformedURLException eMULRe) {
            objRemotoDic = null;
            objRemotoEstadisticas = null;
            JOptionPane.showMessageDialog(null,
                    TDSLanguageUtils.getMessage("cliente.error.conn") + "\n" + eMULRe.getMessage(),
                    TDSLanguageUtils.getMessage("cliente.error"), JOptionPane.ERROR_MESSAGE);
        } catch (Exception eE) {
            objRemotoDic = null;
            objRemotoEstadisticas = null;
            JOptionPane.showMessageDialog(null,
                    TDSLanguageUtils.getMessage("cliente.error.conn") + "\n" + eE.getMessage(),
                    TDSLanguageUtils.getMessage("cliente.error"), JOptionPane.ERROR_MESSAGE);
        }
    }

    private void inicializarComponentes() {
        listaSeleccionar.removeAll();
        listaSeleccionado.removeAll();
    }
    
        /**
     * Método que maneja el evento sobre el cambio de opción en el desplegable de
     * paises.<br />
     * Provoca el refresco de provincias en el desplegable de provincias, mostrando
     * sólo aquellas que corresponden con el país indicado por el desplegable.<br />
     *
     * Invoca al manejador del desplegable de ciudades para también mostrar las
     * ciiudades vinculadas a la primera provincia seleccionada.
     */
    private void comboPaisActionPerformed(java.awt.event.ActionEvent evt) {
        try {
            // Recuperamos el pais seleccionado
            int idPais = ((PaisDTO) comboPais.getSelectedItem()).getIdPais();

            List<ProvinciaDTO> provincias = objRemotoDic.listaProvincias(idPais);
            comboProvincia.removeAllItems();
            provincias.add(0, new ProvinciaDTO(Constantes.NO_SELECT, TDSLanguageUtils.getMessage("combo.provincia.todos.opciondefecto")));
            
            if(itemsSeleccionar == null ) {
                itemsSeleccionar = new DefaultListModel();
            } else {
                itemsSeleccionar.removeAllElements();
            }
            
            listaSeleccionar.setModel(itemsSeleccionar);            
            
            //Si el idPais es el 0, se pintan los países en el cuadro "Seleccionar"
            //De lo contrario se pintan las provincias correspondientes
            if (idPais == 0) {
                List<PaisDTO> paises = objRemotoDic.listaPaises();
                for (PaisDTO inc : paises) {
                    if(inc.getIdPais()!=0)
                        itemsSeleccionar.addElement(inc);                    
                }
                for (ProvinciaDTO inc : provincias) {
                    comboProvincia.addItem(inc);                 
                }                
                
            } else {
                for (ProvinciaDTO inc : provincias) {
                    comboProvincia.addItem(inc);
                    if(inc.getIdProvincia()!=0)
                        itemsSeleccionar.addElement(inc);                    
                }
            }
            
            comboProvinciaActionPerformed(null);

        } catch (GestorDiccionarioException giE) {
            JOptionPane.showMessageDialog(null,
                    giE.getMessage(), TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.err.provincia"),
                    JOptionPane.ERROR_MESSAGE);
        } catch (RemoteException eRe) {
            JOptionPane.showMessageDialog(null,
                    eRe.getMessage(), TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.err.provincia"),
                    JOptionPane.ERROR_MESSAGE);
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null,
                    ex.getMessage(), TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.err.provincia"),
                    JOptionPane.ERROR_MESSAGE);
        }
    }
    
    /**
     * Método que maneja el evento sobre el cambio de opción en el desplegable de
     * provincias.<br />
     * Provoca el refresco de ciudades en el desplegable de ciudades, mostrando
     * sólo aquellas que corresponden con la provincia indicada por el desplegable.<br />
     *
     * Invoca al manejador del desplegable de ciudades para también mostrar las
     * ciiudades vinculadas a la primera provincia seleccionada.
     */
    private void comboProvinciaActionPerformed(java.awt.event.ActionEvent evt) {

        if (comboProvincia.getSelectedItem() == null) {
            return;
        }

        try {
            // Recuperamos la provincia seleccionado
            int idProvincia = ((ProvinciaDTO) comboProvincia.getSelectedItem()).getIdProvincia();

            List<CiudadDTO> ciudades = objRemotoDic.listaCiudades(idProvincia);
            comboCiudad.removeAllItems();
            
            ciudades.add(0, new CiudadDTO(Constantes.NO_SELECT, TDSLanguageUtils.getMessage("combo.ciudad.todos.opciondefecto")));
            for (CiudadDTO inc : ciudades) {
                comboCiudad.addItem(inc);
            }
            
            if(idProvincia!=0) {
                itemsSeleccionar.removeAllElements();
                for (CiudadDTO inc : ciudades) {
                    if(inc.getIdCiudad()!=0)
                        itemsSeleccionar.addElement(inc);                   
                }
            }

        } catch (GestorDiccionarioException giE) {
            JOptionPane.showMessageDialog(null,
                    giE.getMessage(), TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.err.ciudad"),
                    JOptionPane.ERROR_MESSAGE);
        } catch (RemoteException eRe) {
            JOptionPane.showMessageDialog(null,
                    eRe.getMessage(), TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.err.ciudad"),
                    JOptionPane.ERROR_MESSAGE);
        }
    }

    private JComboBox getComboTop() {
                
        if (comboTop == null) {
            try {
                    List<TopDTO> listaTop = objRemotoDic.listaTop();
                        comboTop = new JComboBox(listaTop.toArray());

            } catch (GestorDiccionarioException giE) {
                    JOptionPane.showMessageDialog(null,
                            giE.getMessage(), TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.err.pais"),
                            JOptionPane.ERROR_MESSAGE);
            } catch (RemoteException eRe) {
                    JOptionPane.showMessageDialog(null,
                            eRe.getMessage(), TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.err.pais"),
                            JOptionPane.ERROR_MESSAGE);
            }
        }
        return comboTop;
    }

    public boolean isItemsCiudades() {
        return itemsCiudades;
    }

    public void setItemsCiudades(boolean itemsCiudades) {
        this.itemsCiudades = itemsCiudades;
    }

    public boolean isItemsPaises() {
        return itemsPaises;
    }

    public void setItemsPaises(boolean itemsPaises) {
        this.itemsPaises = itemsPaises;
    }

    public boolean isItemsProvincias() {
        return itemsProvincias;
    }

    public void setItemsProvincias(boolean itemsProvincias) {
        this.itemsProvincias = itemsProvincias;
    }
        
        
    
}
